From fe6814061d691a63359ab2040d40276b4ba7202b Mon Sep 17 00:00:00 2001 From: Federico Mena Quintero Date: Wed, 21 Nov 2012 12:08:23 -0600 Subject: [PATCH] Add menu items to the places sidebar to configure the startup mode Signed-off-by: Federico Mena Quintero --- gtk/gtkplacessidebar.c | 98 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 98 insertions(+) diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index 38320a8c83..47b97e8a64 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -51,6 +51,7 @@ #include "gtkcelllayout.h" #include "gtkcellrenderertext.h" #include "gtkcellrendererpixbuf.h" +#include "gtkfilechooserprivate.h" #include "gtkicontheme.h" #include "gtkimagemenuitem.h" #include "gtkintl.h" @@ -59,6 +60,7 @@ #include "gtkmenuitem.h" #include "gtkmountoperation.h" #include "gtkplacessidebar.h" +#include "gtkradiomenuitem.h" #include "gtkscrolledwindow.h" #include "gtkseparatormenuitem.h" #include "gtksettings.h" @@ -106,6 +108,9 @@ struct _GtkPlacesSidebar { GtkWidget *popup_menu_stop_item; GtkWidget *popup_menu_properties_separator_item; GtkWidget *popup_menu_properties_item; + GtkWidget *popup_menu_settings_separator_item; + GtkWidget *popup_menu_start_in_recent_item; + GtkWidget *popup_menu_start_in_cwd_item; /* volume mounting - delayed open process */ gboolean mounting; @@ -202,6 +207,9 @@ enum { #define ICON_NAME_FOLDER_VIDEOS "folder-videos-symbolic" #define ICON_NAME_FOLDER_SAVED_SEARCH "folder-saved-search-symbolic" +/* Settings keys */ +#define SETTINGS_KEY_STARTUP_MODE "startup-mode" + static guint places_sidebar_signals [LAST_SIGNAL] = { 0 }; static void open_selected_bookmark (GtkPlacesSidebar *sidebar, @@ -1699,6 +1707,9 @@ bookmarks_popup_menu_detach_cb (GtkWidget *attach_widget, sidebar->popup_menu_empty_trash_item = NULL; sidebar->popup_menu_properties_separator_item = NULL; sidebar->popup_menu_properties_item = NULL; + sidebar->popup_menu_settings_separator_item = NULL; + sidebar->popup_menu_start_in_recent_item = NULL; + sidebar->popup_menu_start_in_cwd_item = NULL; } static void @@ -1778,6 +1789,7 @@ bookmarks_check_popup_sensitivity (GtkPlacesSidebar *sidebar) gboolean show_stop; gboolean show_empty_trash; gboolean show_properties; + gboolean show_settings; char *uri = NULL; type = PLACES_BUILT_IN; @@ -1822,6 +1834,13 @@ bookmarks_check_popup_sensitivity (GtkPlacesSidebar *sidebar) } else show_properties = FALSE; + /* The file chooser will turn on showing $CWD in the places sidebar. In this + * case, we know we are being used for the file chooser. For that, also + * present the settings about starting the file chooser in Recent Files or + * in $CWD. + */ + show_settings = sidebar->show_cwd; + gtk_widget_set_visible (sidebar->popup_menu_separator_item, show_mount || show_unmount || show_eject || show_empty_trash); gtk_widget_set_visible (sidebar->popup_menu_mount_item, show_mount); @@ -1833,6 +1852,10 @@ bookmarks_check_popup_sensitivity (GtkPlacesSidebar *sidebar) gtk_widget_set_visible (sidebar->popup_menu_empty_trash_item, show_empty_trash); gtk_widget_set_visible (sidebar->popup_menu_properties_separator_item, show_properties); gtk_widget_set_visible (sidebar->popup_menu_properties_item, show_properties); + gtk_widget_set_visible (sidebar->popup_menu_settings_separator_item, show_settings); + gtk_widget_set_visible (sidebar->popup_menu_settings_separator_item, show_settings); + gtk_widget_set_visible (sidebar->popup_menu_start_in_recent_item, show_settings); + gtk_widget_set_visible (sidebar->popup_menu_start_in_cwd_item, show_settings); /* Adjust start/stop items to reflect the type of the drive */ gtk_menu_item_set_label (GTK_MENU_ITEM (sidebar->popup_menu_start_item), _("_Start")); @@ -2864,6 +2887,60 @@ append_menu_separator (GtkMenu *menu) return GTK_MENU_ITEM (menu_item); } +static GSettings * +get_settings (void) +{ + GSettings *settings; + + settings = g_settings_new_with_path ("org.gtk.Settings.FileChooser", + "/org/gtk/settings/file-chooser/"); + + return settings; +} + +/* Marks the popup_menu_start_in_* menu items as active based on the user's settings */ +static void +update_settings_items (GtkPlacesSidebar *sidebar) +{ + GSettings *settings; + StartupMode startup_mode; + GtkWidget *item; + + settings = get_settings (); + + startup_mode = g_settings_get_enum (settings, SETTINGS_KEY_STARTUP_MODE); + + if (startup_mode == STARTUP_MODE_CWD) + item = sidebar->popup_menu_start_in_cwd_item; + else + item = sidebar->popup_menu_start_in_recent_item; + + gtk_check_menu_item_set_active (GTK_CHECK_MENU_ITEM (item), TRUE); + + g_object_unref (settings); +} + +/* Callback used for the radio menu item group with the user's settings */ +static void +settings_start_in_changed_cb (GtkCheckMenuItem *item, GtkPlacesSidebar *sidebar) +{ + StartupMode startup_mode; + GSettings *settings; + + if (item == GTK_CHECK_MENU_ITEM (sidebar->popup_menu_start_in_recent_item)) + startup_mode = STARTUP_MODE_RECENT; + else if (item == GTK_CHECK_MENU_ITEM (sidebar->popup_menu_start_in_cwd_item)) + startup_mode = STARTUP_MODE_CWD; + else { + g_assert_not_reached (); + return; + } + + settings = get_settings (); + g_settings_set_enum (settings, SETTINGS_KEY_STARTUP_MODE, startup_mode); + g_object_unref (settings); +} + /* Constructs the popup menu for the file list if needed */ static void bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) @@ -2997,6 +3074,27 @@ bookmarks_build_popup_menu (GtkPlacesSidebar *sidebar) gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); bookmarks_check_popup_sensitivity (sidebar); + + /* Settings items */ + + sidebar->popup_menu_settings_separator_item = GTK_WIDGET (append_menu_separator (GTK_MENU (sidebar->popup_menu))); + + item = gtk_radio_menu_item_new_with_label (NULL, _("Start in Recent Files")); + sidebar->popup_menu_start_in_recent_item = item; + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); + + item = gtk_radio_menu_item_new_with_label_from_widget (GTK_RADIO_MENU_ITEM (sidebar->popup_menu_start_in_recent_item), + _("Start in Default Folder")); + sidebar->popup_menu_start_in_cwd_item = item; + gtk_widget_show (item); + gtk_menu_shell_append (GTK_MENU_SHELL (sidebar->popup_menu), item); + + update_settings_items (sidebar); + g_signal_connect (sidebar->popup_menu_start_in_recent_item, "toggled", + G_CALLBACK (settings_start_in_changed_cb), sidebar); + g_signal_connect (sidebar->popup_menu_start_in_cwd_item, "toggled", + G_CALLBACK (settings_start_in_changed_cb), sidebar); } static void -- 2.30.2